package com.file_.ObjectInputAndOutputStream;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

// 使用ObjectInputStream读取data.dat文件并反序列化以恢复数据类型和数据
public class Demo2 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 指定反序列化文件
        String filePath = "D:\\A_Test\\data.dat";
        // 1、创建对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream(filePath));
        // 2、读取
        /* 特别注意：读取（反序列化）文件时的顺序必须和保存（序列化）数据的顺序一致 */
        System.out.println(ois.readInt());
        System.out.println(ois.readBoolean());
        System.out.println(ois.readChar());
        System.out.println(ois.readDouble());
        System.out.println(ois.readUTF());
        Object dog = ois.readObject();  // dog的编译类型是Object，运行类型是Dog
        System.out.println("dog的信息" + dog);  // 底层Object->Dog

        // 这里有个特别重要的细节
        // （1）如果我们希望调用Dog类的方法，需要向下转型
        // （2）因此，需要我们将Dog类的定义放在可以引用的位置
        // （3）最好是将Dog类定义成public
        Dog dogmethod = (Dog) dog;
        System.out.println(dogmethod.getName());

        // 3、关闭处理流
        ois.close();
        System.out.println("读取（反序列化）完毕");
    }
}
